package cn.com.zzl.util;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Calendar;

/**
 * Description：日志工具类（说实话该工具类的作用和logger的作用基本上一致）
 * Created by 朱正磊 on 2017-05-11 17:01.
 */
public class LogTool {

	private PrintWriter logPrint;//日志文件
	private String logFile = "";//日志文件路径（全路径，路径+名称）
	private String logName = "";//日志文件名（可有可无）
	private String className = "";//调用该日志工具类的类名（包名+类名）
	private String methodName = "";//调用该日志工具类方法的方法名
	private int lineNumber = 0;//调用该日志工具类方法的行号

	/**
	 * @Desc 配置没有logName的log
	 */
	public LogTool(){
		checkDate();//作用其实就是初始化logPrint（logFile在本类更像是一个中间过渡变量）
	}

	/**
	 * @Desc 配置log文件的logName
	 * @param logName
	 */
	public LogTool(String logName){
		this.logName = logName;
		checkDate();//作用其实就是初始化logPrint（logFile在本类更像是一个中间过渡变量）
	}

	/**
	 * @Desc 获取log文件名，说明 ./表示System.getProperty("user.dir")
	 * @return
	 */
	private String getLogFile(){
		String dateStr ;
		Calendar instance = Calendar.getInstance();
		int year = instance.get(Calendar.YEAR);//年
		int month = instance.get(Calendar.MONTH) + 1;//月份从0开始，即0-11
		int day = instance.get(Calendar.DAY_OF_MONTH);//日

		//dateStr = "./log/" + logName + year + "-";//相对路径是有问题的在这里，只能使用绝对路径
		dateStr = "E:\\log\\" + logName + year + "-";

		if(month < 10){
			dateStr += 0;
		}
		dateStr += month + "-";

		if(day < 10){
			dateStr += 0;
		}
		dateStr += day + ".log";

		return dateStr;
	}

	/**
	 * @Desc 设置logPrint，如果没有log目录，则新建log文件
	 * 说明：./表示System.getProperty("user.dir")，表示当前项目所在路径，比如D:\workspace\project\ideaProject\demo
	 * 该方法时灵时不灵，不知道问题出在哪里！
	 */
	/*private void newLog(){
		logFile = getLogFile();
		try {
			//该行代码是该类最关键的一行代码，如果log所在目录不存在那么会先创建目录（不是自动创建，而是走下面的mkdir方法）
			//如果log文件不存在那么会自动创建log文件（new FileWriter），如果存在就不会再创建，
			//其中的第二个参数true表示追加（new FileWriter），而不是覆盖（false表示覆盖）
			logPrint = new PrintWriter(new FileWriter(logFile,true),true);
		} catch (IOException e) {
			(new File("./log")).mkdir();//如果不存在log目录就创建
			try {
				logPrint = new PrintWriter(new FileWriter(logFile,true),true);
			} catch (IOException e1) {
				System.out.println("无法打开日志文件：" + logFile);
				logPrint = new PrintWriter(System.err);
			}
		}
	}*/

	/**
	 * @Desc 设置logPrint，如果没有log目录，则新建log文件
	 */
	private void newLog(){
		logFile = getLogFile();
		File file = new File(logFile);
		if(!file.getParentFile().exists()){//如果父文件（文件夹）不存在
			file.getParentFile().mkdirs();//只会创建文件夹，不会创建文件
		}
		/*if(!file.exists()){//如果文件不存在
			try {
				file.createNewFile();//创建文件
			} catch (IOException e) {
				e.printStackTrace();
			}
		}*/
		try {
			//如果log文件不存在那么会自动创建log文件（new FileWriter），如果存在就不会再创建
			logPrint = new PrintWriter(new FileWriter(logFile,true),true);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * @Desc 检查日期，如果改变，新建log文件
	 */
	private void checkDate(){
		if(logFile == null || logFile.trim().equals("") || !logFile.equals(getLogFile())){
			newLog();
		}
	}

	/**
	 * @Desc 将文本信息与异常信息写入日志文件（异常信息可以为null）
	 * @param msg
	 * @param e
	 */
	public void log(String msg, Throwable e){
		//checkDate();//该行代码多余，因为在构造函数里面已经执行过了（实例化对象）不需要再次执行
		className = new Throwable().getStackTrace()[1].getClassName();
		methodName = new Throwable().getStackTrace()[1].getMethodName();
		lineNumber = new Throwable().getStackTrace()[1].getLineNumber();
		logPrint.println(getContent(msg));
		if(e != null){
			e.printStackTrace(logPrint);
		}
	}

	/**
	 * @Desc 设置打印内容格式
	 * @param msg
	 * @return
	 */
	private String getContent(String msg){
		return CalendarUtil.getNowDate("yyyy-MM-dd HH:mm:ss") +
					"：class " + className +
					"：method " + methodName +
					"：line " + lineNumber +
					"：" + msg;
	}

}
